package com.hex.ds.hdrs.label.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.hex.ds.hdrs.label.dao.LabelJobDao;
import com.hex.ds.hdrs.label.po.LabelJobPo;
import com.hex.ds.hdrs.label.service.ILabelJobService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @Package: com.hex.ds.hdrs.label.service.impl
 * @ClassName LabelAppServiceImpl
 * @Description: 标签应用关系表
 * @Author: ji.tang
 * @Date 2022/3/29 10:52
 * @Version v1.0
 **/
@Slf4j
@Service
public class LabelJobServiceImpl implements ILabelJobService {

    @Autowired
    private LabelJobDao labelJobDao;

    /*
     * @Method: add <br>
     * @Param: [jobCode, labelCode] <br>
     * @Return: void <br>
     * @Description：新增作业与标签关联配置<br>
     * @Author： wz.li<br>
     * @Date： 2023/3/29 19:00 <br>
     * @Version： V2.0.2<br>
     */
    @Override
    public void add(String jobCode, String labelCode) {
        log.info("新增作业与标签关联配置,作业编码：{}",labelCode);
        LabelJobPo labelJobPo = new LabelJobPo(jobCode, labelCode, null);
        int count = labelJobDao.insert(labelJobPo);
        if (count != 1){
            throw new RuntimeException("新增作业与标签关联失败");
        }
    }

    /*
     * @Method: update <br>
     * @Param: [jobCode, labelCodeList] <br>
     * @Return: void <br>
     * @Description：更新周期作业定义与标签关联配置<br>
     * @Author： wz.li<br>
     * @Date： 2023/3/29 19:51 <br>
     * @Version： V2.0.2<br>
     */
    @Override
    public void update(String jobCode, List<String> labelCodeList) {
        deleteByJobCode(jobCode);
        if (CollectionUtil.isNotEmpty(labelCodeList)) {
            log.info("更新周期作业定义与标签关联配置,作业编码:{}",jobCode);
            for (String labelCode : labelCodeList) {
                add(jobCode, labelCode);
            }
        }
    }

    /*
     * @Method: deleteByJobCode <br>
     * @Param: [jobCode] <br>
     * @Return: void <br>
     * @Description：根据作业编码删除关联关系<br>
     * @Author： wz.li<br>
     * @Date： 2023/3/29 19:52 <br>
     * @Version： V2.0.2<br>
     */
    @Override
    public void deleteByJobCode(String jobCode) {
        if (StrUtil.isNotBlank(jobCode)){
            log.info("根据作业编码删除关联关系,作业编码：{}",jobCode);
            labelJobDao.deleteByJobCode(jobCode);
        }
    }

    /*
     * @Method: queryListByJobCode <br>
     * @Param: [jobCode] <br>
     * @Return: java.util.List<java.lang.String> <br>
     * @Description：根据作业编码查询所有关联的标签编码<br>
     * @Author： wz.li<br>
     * @Date： 2023/4/19 11:14 <br>
     * @Version： V2.0.2<br>
     */
    @Override
    public List<String> queryListByJobCode(String jobCode) {
        List<LabelJobPo> labelJobPoList = labelJobDao.queryList(new LabelJobPo().setJobCode(jobCode));
        return labelJobPoList.stream().map(LabelJobPo::getLabelCode).collect(Collectors.toList());
    }

    /*
     * @Method: queryListByLabelCode <br>
     * @Param: [labelCode] <br>
     * @Return: java.util.List<java.lang.String> <br>
     * @Description：根据标签编码查询关联的作业编码<br>
     * @Author： wz.li<br>
     * @Date： 2023/4/19 11:16 <br>
     * @Version： V2.0.2<br>
     */
    @Override
    public List<String> queryListByLabelCode(String labelCode) {
        List<LabelJobPo> labelJobPoList = labelJobDao.queryList(new LabelJobPo().setLabelCode(labelCode));
        return labelJobPoList.stream().map(LabelJobPo::getJobCode).collect(Collectors.toList());
    }

    /**
     * @Method: queryLabelByJobCode <br>
     * @Param: [jobCode] <br>
     * @Return: java.util.List<java.lang.String> <br>
     * @Description：查询同一标签的作业编码<br>
     * @Author： gc.zuo<br>
     * @Date： 2022/4/1 10:39 <br>
     * @Version： V1.0<br>
     */
    @Override
    public List<String> queryLabelByJobCode(String jobCode) {
        return this.labelJobDao.queryLabelByJobCode(jobCode);
    }

    /**
     * @Method: qryJobCodeByLabelName <br>
     * @Param: [labelName] <br>
     * @Return: java.util.List<java.lang.String> <br>
     * @Description：标签名称模糊查询作业编码<br>
     * @Author： gc.zuo<br>
     * @Date： 2022/4/2 16:28 <br>
     * @Version： V1.0<br>
     */
    @Override
    public List<String> qryJobCodeByLabelName(String labelName) {
        return this.labelJobDao.qryJobCodeByLabelName(labelName);
    }

    /**
     * @Method: qryLabelIsInUser <br>
     * @Param: [pkId] <br>
     * @Return: java.util.List<java.lang.String> <br>
     * @Description：查询标签是否有使用<br>
     * @Author： gc.zuo<br>
     * @Date： 2022/4/2 16:52 <br>
     * @Version： V1.0<br>
     */
    @Override
    public List<String> qryLabelIsInUser(String pkId) {
        return this.labelJobDao.qryLabelIsInUser(pkId);
    }
}
